package cn.tedu.v4;

/**
 * Version 4.0 消息转发功能
 * 功能: 一个客户端发送给服务器文本，转发至其他客户端
 *   客户端  多线程  ×
 *   服务器  多线程  √  只加一个多线程，替换  消息转发  方案
 * -----------------------------------------------------
 * 多线程并发产生的安全问题:
 * 当多个线程并发操作同一个资源时，由于线程切换时间不确定，
 * 【CPU时间片获取线程时机不确定】，可能导致代码执行混乱或者进入正确状态，
 * 程序出现错误，更严重情况软件瘫痪
 *
 * synchronized  多线程关键字   同步锁
 *
 * 语法情景1: 同步块方式
 *    语法: synchronized(同步监视对象){
 *
 *    }
 * 语法情景2: 同步方法方式
 *    语法: public synchronized void method(){
 *
 *    }
 * 同步机制: 可以控制线程执行顺序，避免线程间切换冲突  √
 * 异步机制: 不控制线程执行顺序，执行两套功能顺序     ×
 *
 *
 * 案例: 去WC流程  创建两个线程 两个人去wc
 */
public class Thread_syn {
    public static void main(String[] args) {
    //创建WC
    WC wc=new WC();
    //创建两个线程
    Thread p1=new Thread(()->{
        wc.go();
    });
    Thread p2=new Thread(()->{
        wc.go();
    });
    //统一启动
    p1.start();
    p2.start();
}
}
//创建wc
class  WC{
    public void go(){ //去WC
        Thread t=Thread.currentThread(); //获取线程实例: Thread[main,5,man]
        System.out.println(t.getName()+"去洗手间....");
        try {  //this 指代当前线程--哪条线程先被CPU时间片选中，先被执行
            synchronized (this) {  //监视同步对象: 先来的线程立即确定上锁！
                Thread.sleep(5000);
                System.out.println(t.getName()+"找门进去....");
            }
            Thread.sleep(3000);
            System.out.println(t.getName()+"洗手离开....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
